package user;

import book.Book;
import book.Library;
import book.PairOfUidAndBookId;
import utils.AnalyzingBorrowedBook;

import java.util.Scanner;

import constant.Constant;

public class NormalUser extends User{

    // 用户已借阅图书的相关信息
    private PairOfUidAndBookId[] pairOfUidAndBookIds;

    //生成解析书籍借阅信息的类实例
    AnalyzingBorrowedBook analyzingBorrowedBook = new AnalyzingBorrowedBook();

    //当前用户书籍借阅量
    private int borrowedCount;

    //书籍借阅上限
    private static final int BORROW_BOOK_MAX_NUM = 5;

    private Library library;

    Scanner sc = new Scanner(System.in);

    public NormalUser(String userName, int userID) {
        super(userName,userID,"普通用户");
        library = Library.getLibrary();
        loadBorrowedBook();
    }

//    private void loadBorrowedBook() {
//        //默认用户借阅读书数组大小
//        pairOfUidAndBookIds = new PairOfUidAndBookId[BORROW_BOOK_MAX_NUM];
//            //将数据拷贝到已读取书籍数组中
//            for (int i = 0; i < allBorrowedBooks.length; i++) {
//                //过滤掉非该用户借阅信息
//                if(allBorrowedBooks[i].userId == this.userID) {
//                    pairOfUidAndBookIds[borrowedCount++] = allBorrowedBooks[i];
//                }
//            }
//
//    }

    //下载文件中的借阅信息至内存中
    private void loadBorrowedBook() {
        //1.先加载文件当中的借阅信息
        PairOfUidAndBookId[] allBorrowedBook= analyzingBorrowedBook.loadObject(Constant.BORROWED_BOOK_FILE_NAME);
        //2. 默认已借阅的图书数组大小为BORROW_BOOK_MAX_NUM，这里也可以定义到常量类
        pairOfUidAndBookIds = new PairOfUidAndBookId[BORROW_BOOK_MAX_NUM];
        //3.没有读取到已借阅的图书信息 ***********(先用 allBorrowedBook 来读取记录,防止为空的情况下无法向 pairOfUidAndBookIds 中添加数据)******************
        if (allBorrowedBook== null) {
            borrowedCount = 0;
        } else {
            //4. 查看实际读取到的数组长度是多少？
            int allBorrowedBookLen= allBorrowedBook.length;
            //5. 如果读取到了10本书被借阅 但是当前borrowedBooks数组长度小于10
            if (allBorrowedBookLen> pairOfUidAndBookIds.length) {
                //6. 按照实际情况进行分配数组内存
                pairOfUidAndBookIds = new PairOfUidAndBookId[allBorrowedBookLen];
            }
            //7.把数据拷贝回到 已借阅图书信息的数组当中
            for (int i = 0; i < allBorrowedBookLen; i++) {
                //if(信息.userID == this.userID) 过滤掉非该用户的借阅记录,对现阶段的我来说有点难以实现,太过于复杂
                pairOfUidAndBookIds[i] = allBorrowedBook[i];
            }
            //8.更新当前实际借阅书籍的书籍数量
            borrowedCount = allBorrowedBookLen;
        }

    }

    //将信息存储至文件硬盘中
    private void storeBorrowedBook() {
        analyzingBorrowedBook.storeObject(pairOfUidAndBookIds,Constant.BORROWED_BOOK_FILE_NAME);
    }

    @Override
    public int display() {
        System.out.println("普通用户 " + userName + " 的操作菜单:");
        System.out.println("1. 查找图书");
        System.out.println("2. 打印所有的图书");
        System.out.println("3. 退出系统");
        System.out.println("4. 借阅图书");
        System.out.println("5. 归还图书");
        System.out.println("6. 查看当前个⼈借阅情况");
        System.out.println("请选择你的操作：");
        return sc.nextInt();
    }

    //借阅书籍
    public void borrowBook() {
        //判断是否达到借阅上限
        if(this.borrowedCount == BORROW_BOOK_MAX_NUM) {
            System.out.println("你已达到借阅上限,不能再借阅书籍,请归还图书后再借阅图书!");
            return;
        }
        //如果没有书籍上架,那么不能借阅
        if(library.getBookCount() == 0) {
            System.out.println("书架还没有上架书籍,暂时还不能借阅书籍");
            return;
        }

        sc.nextLine();// 吞掉换行符
        System.out.println("请输入你要借阅的图书Id:");
        int bookId = sc.nextInt();
        sc.nextLine();

        //加载已经借阅的书籍信息
        loadBorrowedBook();
        //判断要借阅的书是否存在
        Book book = library.searchBook(bookId);
        if(book == null) {
            System.out.println("借阅失败,没有找到该书籍");
        }
        //检查该图书是否被借阅
        for (int i = 0; i < borrowedCount; i++) {
            if(pairOfUidAndBookIds[i].getBookId() == bookId) {
                if(pairOfUidAndBookIds[i].getUserId() == this.userID) {
                    System.out.println("你已借阅该书籍!");
                    return;
                } else {
                    System.out.println("该图书已被其他人借阅!");
                    return;
                }
            }
        }

        //执行借阅操作
        library.borrowBook(bookId);

        //封装对象写到借阅表中
        PairOfUidAndBookId pairOfUidAndBookId = new PairOfUidAndBookId(this.userID,bookId);
        pairOfUidAndBookIds[borrowedCount++] = pairOfUidAndBookId;
        //存储借阅信息
        storeBorrowedBook();

        System.out.println("借阅成功!");

    }

    //归还图书
    public void returnBook() {
        //加载借阅信息
        loadBorrowedBook();

        //检查如果没有借阅书籍，就不能归还
        if(borrowedCount == 0) {
            System.out.println("您没有借阅过书籍,无需归还书籍");
            return;
        }
        sc.nextLine();// 吞掉换行符
        System.out.println("请输入你要归还的图书Id:");
        int bookId = sc.nextInt();
        sc.nextLine();// 吞掉换行符

        //获取要归还的图书信息
        Book book = library.searchBook(bookId);
        //没找到该图书信息,归还失败
        if(book == null) {
            System.out.println("输入图书Id错误,没有该图书");
            return;
        }

        for (int i = 0; i < borrowedCount; i++) {
            //如果2本书的ID，则认为是同一本书
            if (pairOfUidAndBookIds[i].getBookId() == bookId) {
                //借阅用户也一样
                if (this.userID == pairOfUidAndBookIds[i].getUserId()) {

                    library.returnBook(bookId);

                    System.out.println("图书 '" + book.getTitle() + "' 已成功归还。");
                    // 用最后一本替换归还的书
                    pairOfUidAndBookIds[i] = pairOfUidAndBookIds[borrowedCount - 1];
                    // 清空最后一个
                    pairOfUidAndBookIds[borrowedCount - 1] = null;
                    borrowedCount--;
                    storeBorrowedBook();
                }else{
                    System.out.println("该书籍不是你借阅的书籍，不能归还："+book.getTitle());
                }
                return;
            }
        }
        System.out.println("你没有借阅该书籍,无需归还");
    }

    // 查看个⼈借阅情况
    public void viewBorrowHistory() {
        //读取当前用户借阅书籍情况
        loadBorrowedBook();
        if(borrowedCount == 0) {
            System.out.println("你还没有借阅书籍,没有借阅记录!");
        }

        for (int i = 0; i < borrowedCount; i++) {
            Book book = library.searchBook(pairOfUidAndBookIds[i].getBookId());
            System.out.println(book);
        }
    }




}
